package com.zed.api.games.scene;

import com.zed.api.games.GameBuilderNotExistException;
import com.zed.api.games.RunningGameNotExistException;
import com.zed.api.games.event.GameStartingEvent;
import reactor.core.publisher.Mono;

/**
 * 游戏生命周期场景
 * <br>
 * 主角: 用户<br>
 * 业务场景：开始游戏、结束游戏
 *
 * @author Zed
 */
public interface GameLifeCycle {


    /**
     * 开启游戏
     *
     * <pre>
     * 业务逻辑
     *
     * 一、前置处理
     * 1、判断是否存在游戏构建Id{@code gameBuilderId},如果不存在则抛出异常 {@link GameBuilderNotExistException}
     * 2、判断用户是否结束了上一个游戏,如果没有结束返回上个游戏的Id
     *
     * 二、业务处理
     * 1、利用{@link com.zed.api.games.GameBuilder}构建一个游戏
     *
     * 三、后置处理
     * 1、将游戏添加到运行时游戏仓储
     * 2、事件总线通知游戏创建事件 {@link GameStartingEvent}
     *
     * </pre>
     *
     * @param gameBuilderId {@link String},所选游戏id
     * @return {@link Mono},返回唯一运行时游戏Id
     */
    Mono<String> startGame(String gameBuilderId);

    /**
     * 结束游戏
     *
     * <pre>
     * 业务逻辑
     *
     * 一、前置处理
     * 1、判断运行时游戏是否存在,如果不存在则抛出异常 {@link RunningGameNotExistException}
     *
     * 二、业务处理
     * 1、释放内存中的资源,并移除运行时游戏
     *
     * 三、后置处理
     * 1、事件总线广播{@link com.zed.api.games.event.GameEndingEvent}
     *
     * </pre>
     *
     * @param gameId {@link String},运行时游戏Id
     * @return {@link Mono}
     */
    Mono<String> endGame(String gameId);

}
